/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import BaseDatos.GestorPrestamosBD;
import Modelo.Prestamo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Marko
 */
public class GestorPrestamos {

////////////////////////////////////////////////////////////////////////////////
// Constructores
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * Constructor por defecto de la clase
     */
    public GestorPrestamos(){
        
    }

////////////////////////////////////////////////////////////////////////////////
// Interfaz de la clase
////////////////////////////////////////////////////////////////////////////////

    /**
     * administra la busqueda de los prestamos activos
     * @param _matriculaONombre
     * @return devuelve los prestamos activos encontrados
     */
    public ArrayList<Prestamo> buscarPrestamosActivos(String _matriculaONombre) {
        GestorPrestamosBD administradorPrestamosBD = new GestorPrestamosBD();
        return administradorPrestamosBD.buscarPrestamos(_matriculaONombre);
    }
    
    /**
     * verifica que el equipo seleccionado este disponible para el prestamo
     * @param _numInventario
     * @return Devuelve verdadero en caso de que el articulo este disponible
     */
    public boolean verificarDisponibilidadEquipo(String _numInventario){
        Prestamo prestamo = buscarPrestamo(_numInventario);
        boolean prestamoDisponible = true;
        if(prestamo == null){
            return prestamoDisponible;
        }else{
            return !prestamoDisponible;
        }       
    }
    
    /**
     * gestiona la cancelacion para un prestamo
     * @param _canceladoPor
     * @param _fechaCancelacion
     * @param _matricula
     * @param _numInventario 
     */
    public void cancelar(
     String _canceladoPor,
     Date _fechaCancelacion,
     String _matricula, 
     String _numInventario
    ){ 
        GestorPrestamosBD administradorPrestamosBD = new GestorPrestamosBD();
        administradorPrestamosBD.cancelar(_canceladoPor, _fechaCancelacion, _matricula, 
        _numInventario);
    }
    
    /**
     * gestiona el proceso para la devolucion de un equipo de computo
     * @param _matricula
     * @param _numInventario
     * @param _recibidaPor 
     * @param _fechaDevolucion 
     * @param _fechaLimiteDevolucion 
     */
    public void devolucion(
     String _matricula,
     String _numInventario,
     String _recibidaPor,
     Date _fechaDevolucion,
     String _fechaLimiteDevolucion
    ){  
        
        if(devolucionATiempo(_fechaDevolucion)){
            registrarDevolucion(_matricula, _numInventario, _recibidaPor, _fechaDevolucion);
        }else{
            long diasRetaso = obtenerDiasRetraso(_fechaLimiteDevolucion);
        }
    }
    
    /**
     * 
     * @param _prestamo
     */
    public void modificarPrestamo(Prestamo _prestamo){
        GestorPrestamosBD administradorPrestamosBD = new GestorPrestamosBD();
        administradorPrestamosBD.modificar(_prestamo);
    }
    
    /**
     * gestiona los nuevos prestamos
     * @param _nuevoPrestamo 
     */
    public void nuevoPrestamo(Prestamo _nuevoPrestamo) {
        GestorPrestamosBD administradorPrestamosBD = new GestorPrestamosBD();
        administradorPrestamosBD.registrar(_nuevoPrestamo);
    }
    
    /**
     * solicita la renovacion de un prestamo
     * @param _modificadoPor
     * @param _numInventario 
     */
    public void renovacion(String _modificadoPor, String _numInventario){
        GestorPrestamosBD administradorPrestamosBD = new GestorPrestamosBD();
        Date fechaDevolucion = obtenerFechaRenovacion();
        final int prestamoRenovado = 1;
        administradorPrestamosBD.renovacion(_modificadoPor, fechaDevolucion, prestamoRenovado, _numInventario);
    }
    
////////////////////////////////////////////////////////////////////////////////
// Metodos Privados
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * Aumente la fecha limite para la devolucion de un prestamo
     * @return Devuelve la fecha del dia siguiente al actual
     */
    private Date obtenerFechaRenovacion(){
        Date fechaDevolucion = new Date();
        int dia = fechaDevolucion.getDate() + 1;
        final int hora = 20;
        final int minutos = 30;
        fechaDevolucion.setDate(dia);
        fechaDevolucion.setHours(hora);
        fechaDevolucion.setMinutes(minutos);
        return fechaDevolucion;
    }
    
    /**
     * solicita el prestamo que coincida con el numero de inventario ingresado
     * @param _numInventario
     * @return Devuelve el prestamo encontrado
     */
    private Prestamo buscarPrestamo(String _numInventario){
        GestorPrestamosBD administradorPrestamosBD = new GestorPrestamosBD();
        return administradorPrestamosBD.buscarPrestamo(_numInventario);
    }
    
    /**
     * comprueba que la fecha en que se devolvio el prestamo este en tiempo
     * @param _fechaDevolucion
     * @return Devuelve verdadero si y solo si el prestamo esta en tiempo de devolucion
     */
    private boolean devolucionATiempo(Date _fechaDevolucion){       
        Date fechaActual = new Date();
        boolean prestamoATiempo = true;
        
        if(fechaActual.after(_fechaDevolucion)){
            return !prestamoATiempo;
        }else{
            return prestamoATiempo;
        }
    }
    
    /**
     * obtiene los dias que tardo el alumno en devolver el prestamo segun la
     * fecha limite para devolverlo
     * @param _fechaDevolucion
     * @return Devuelve la cantidad de dias de retraso o -1 en caso de que ocurra un error
     */
    private long obtenerDiasRetraso(String _fechaLimiteDevolucion){
        Date fechaLimiteDevolucion;
        Date fechaActual = new Date();
        final int MILISEGUNDOS_DIA = (24 * 60 * 60 * 1000);
        SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
        
        try {
            fechaLimiteDevolucion = formatoFecha.parse(_fechaLimiteDevolucion);
            long diferenciaMilisegundos = fechaActual.getTime() - fechaLimiteDevolucion.getTime();
            long diferenciaDias = diferenciaMilisegundos/MILISEGUNDOS_DIA;
            return diferenciaDias;
        } catch (ParseException ex) {
            GestorMensajes administradorMensajes = new GestorMensajes();
            administradorMensajes.mensaje("Error al convertir la fecha de devolucion(GestorPrestamos 195):  " + _fechaLimiteDevolucion);
            final int error = -1;
            return error;
        }
    }
    
    /**
     * gestiona el proceso para la devolucion de un equipo de computo
     * @param _matricula
     * @param _numInventario
     * @param _recibidaPor 
     * @param _fechaDevolucion
     */    
    private void registrarDevolucion(
     String _matricula,
     String _numInventario,
     String _recibidaPor,
     Date _fechaDevolucion
    ){
        GestorPrestamosBD administradorPrestamosBD = new GestorPrestamosBD();
        administradorPrestamosBD.devolucion(_matricula, _numInventario, _recibidaPor, _fechaDevolucion);
    }

////////////////////////////////////////////////////////////////////////////////
// Declaracion de Variables
////////////////////////////////////////////////////////////////////////////////
}